package top.frsf.action;

import top.frsf.object.GameObject;

import java.util.Map;
import java.util.WeakHashMap;

/**
 * 攻击接口
 *
 * @author He Kuntao
 * @since 2025/8/5 9:39
 */
public interface TimeAttackAble {
    /**
     * 攻击间隔MAP
     */
    Map<TimeAttackAble, Long> CD_MAP = new WeakHashMap<>();

    /**
     * 最后攻击时间MAP
     */
    Map<TimeAttackAble, Long> LAST_CD_TIME_MAP = new WeakHashMap<>();

    /**
     * 获取攻击间隔
     *
     * @return 攻击间隔
     */
    default long getAttackCd() {
        return CD_MAP.getOrDefault(this, 1000L);
    }

    /**
     * 设置攻击间隔
     *
     * @param attackCd 攻击间隔
     */
    default void setAttackCd(long attackCd) {
        CD_MAP.put(this, attackCd);
    }

    /**
     * 获取最后攻击时间
     *
     * @return 最后攻击时间
     */
    default long getLastAttackTime() {
        return LAST_CD_TIME_MAP.getOrDefault(this, 0L);
    }

    /**
     * 设置最后攻击时间
     *
     * @param time 最后攻击时间
     */
    default void setLastAttackTime(long time) {
        LAST_CD_TIME_MAP.put(this, time);
    }

    /**
     * 攻击模板方法
     *
     * @param target 目标
     */
    default void attack(GameObject target) {
        if (canAttack()) {
            performAttack(target);
            setLastAttackTime(System.currentTimeMillis());
        }
    }

    /**
     * 是否可以攻击判断
     *
     * @return ture-可以攻击，反之false
     */
    default boolean canAttack() {
        return System.currentTimeMillis() - getLastAttackTime() >= getAttackCd();
    }

    /**
     * 攻击行为，需要实现类提供
     *
     * @param target 攻击对象
     */
    void performAttack(GameObject target);
}
